/**
 * @func 手写apply
 * @param {function} context  // 需要绑定的this
 * @param {Array} args 
 * @returns 
 */
Function.prototype.myApply = function(context,args){
    // 不传this指向则默认指向window
    context=context||window;
    args = args ? args:[];
    //给context新增一个独一无二的属性以免覆盖原有属性
    const key = Symbol();
    context[key]=this;
    //通过隐式绑定的方式调用函数
    const result = context[key](...args);
    //删除添加的属性
    delete context[key];
    //返回函数调用的返回值
    return result;
}

// 测试
const obj1 = {
    name: 'joy',
    getName() {
        console.log(this.name); 
    }
};

const obj2 = {
    name: 'sam'
};

obj1.getName.myApply(obj2);  //sam